
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { calculateTextPosition } from 'zrender/lib/contain/text.js';
import { isArray, isNumber } from 'zrender/lib/core/util.js';
export function createSectorCalculateTextPosition(positionMapping, opts) {
	opts = opts || {};
	var isRoundCap = opts.isRoundCap;
	return function (out, opts, boundingRect) {
		var textPosition = opts.position;

		if (!textPosition || textPosition instanceof Array) {
			return calculateTextPosition(out, opts, boundingRect);
		}

		var mappedSectorPosition = positionMapping(textPosition);
		var distance = opts.distance != null ? opts.distance : 5;
		var sector = this.shape;
		var cx = sector.cx;
		var cy = sector.cy;
		var r = sector.r;
		var r0 = sector.r0;
		var middleR = (r + r0) / 2;
		var startAngle = sector.startAngle;
		var endAngle = sector.endAngle;
		var middleAngle = (startAngle + endAngle) / 2;
		var extraDist = isRoundCap ? Math.abs(r - r0) / 2 : 0;
		var mathCos = Math.cos;
		var mathSin = Math.sin; // base position: top-left

		var x = cx + r * mathCos(startAngle);
		var y = cy + r * mathSin(startAngle);
		var textAlign = 'left';
		var textVerticalAlign = 'top';

		switch (mappedSectorPosition) {
		case 'startArc':
			x = cx + (r0 - distance) * mathCos(middleAngle);
			y = cy + (r0 - distance) * mathSin(middleAngle);
			textAlign = 'center';
			textVerticalAlign = 'top';
			break;

		case 'insideStartArc':
			x = cx + (r0 + distance) * mathCos(middleAngle);
			y = cy + (r0 + distance) * mathSin(middleAngle);
			textAlign = 'center';
			textVerticalAlign = 'bottom';
			break;

		case 'startAngle':
			x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, distance + extraDist, false);
			y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, distance + extraDist, false);
			textAlign = 'right';
			textVerticalAlign = 'middle';
			break;

		case 'insideStartAngle':
			x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, -distance + extraDist, false);
			y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, -distance + extraDist, false);
			textAlign = 'left';
			textVerticalAlign = 'middle';
			break;

		case 'middle':
			x = cx + middleR * mathCos(middleAngle);
			y = cy + middleR * mathSin(middleAngle);
			textAlign = 'center';
			textVerticalAlign = 'middle';
			break;

		case 'endArc':
			x = cx + (r + distance) * mathCos(middleAngle);
			y = cy + (r + distance) * mathSin(middleAngle);
			textAlign = 'center';
			textVerticalAlign = 'bottom';
			break;

		case 'insideEndArc':
			x = cx + (r - distance) * mathCos(middleAngle);
			y = cy + (r - distance) * mathSin(middleAngle);
			textAlign = 'center';
			textVerticalAlign = 'top';
			break;

		case 'endAngle':
			x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, distance + extraDist, true);
			y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, distance + extraDist, true);
			textAlign = 'left';
			textVerticalAlign = 'middle';
			break;

		case 'insideEndAngle':
			x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, -distance + extraDist, true);
			y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, -distance + extraDist, true);
			textAlign = 'right';
			textVerticalAlign = 'middle';
			break;

		default:
			return calculateTextPosition(out, opts, boundingRect);
		}

		out = out || {};
		out.x = x;
		out.y = y;
		out.align = textAlign;
		out.verticalAlign = textVerticalAlign;
		return out;
	};
}
export function setSectorTextRotation(sector, textPosition, positionMapping, rotateType) {
	if (isNumber(rotateType)) {
		// user-set rotation
		sector.setTextConfig({
			rotation: rotateType
		});
		return;
	} else if (isArray(textPosition)) {
		// user-set position, use 0 as auto rotation
		sector.setTextConfig({
			rotation: 0
		});
		return;
	}

	var shape = sector.shape;
	var startAngle = shape.clockwise ? shape.startAngle : shape.endAngle;
	var endAngle = shape.clockwise ? shape.endAngle : shape.startAngle;
	var middleAngle = (startAngle + endAngle) / 2;
	var anchorAngle;
	var mappedSectorPosition = positionMapping(textPosition);

	switch (mappedSectorPosition) {
	case 'startArc':
	case 'insideStartArc':
	case 'middle':
	case 'insideEndArc':
	case 'endArc':
		anchorAngle = middleAngle;
		break;

	case 'startAngle':
	case 'insideStartAngle':
		anchorAngle = startAngle;
		break;

	case 'endAngle':
	case 'insideEndAngle':
		anchorAngle = endAngle;
		break;

	default:
		sector.setTextConfig({
			rotation: 0
		});
		return;
	}

	var rotate = Math.PI * 1.5 - anchorAngle;
	/**
   * TODO: labels with rotate > Math.PI / 2 should be rotate another
   * half round flipped to increase readability. However, only middle
   * position supports this for now, because in other positions, the
   * anchor point is not at the center of the text, so the positions
   * after rotating is not as expected.
   */

	if (mappedSectorPosition === 'middle' && rotate > Math.PI / 2 && rotate < Math.PI * 1.5) {
		rotate -= Math.PI;
	}

	sector.setTextConfig({
		rotation: rotate
	});
}

function adjustAngleDistanceX(angle, distance, isEnd) {
	return distance * Math.sin(angle) * (isEnd ? -1 : 1);
}

function adjustAngleDistanceY(angle, distance, isEnd) {
	return distance * Math.cos(angle) * (isEnd ? 1 : -1);
}